/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador;

import BD.MyException;
import Clases.Categoria;
import Clases.Responsable;
import Clases.Tarea;
import DAO.DAOCategoria;
import DAO.DAOResponsable;
import DAO.DAOTarea;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
 *
 * @author ppr
 */
public class ControladorTarea {

    private List<Responsable> responsables;
    private List<Categoria> categorias;
    private List<Tarea> tareas;
    private DefaultTableModel modeloCompleto;
    private List<File> ls = new ArrayList<File>();

    public ControladorTarea() {
        this.cargarResponsables();
        this.cargarTareas();
        this.cargarCategorias();
    }

    public TableModel modelResponsable(TableModel modelo) {
        DefaultTableModel model = (DefaultTableModel) modelo;
        //////
        int filas = modelo.getRowCount();
        for (int i = 0; filas > i; i++) {
            model.removeRow(0);
        }
        //////
        this.cargarResponsables();
        for (Responsable responsable : this.responsables) {
            String[] dato = {responsable.getNombre(), responsable.getEmail()};
            model.addRow(dato);
            ls.add(new File(responsable.getPathFoto()));
        }

        return model;
    }

    public ArrayList<String> listaResponsableNombres() {
        ArrayList<String> temp = new ArrayList();
        for (Responsable responsable : this.responsables) {
            temp.add(responsable.getNombre());
        }
        return temp;
    }

    public JComboBox getComboCategorias() {
        JComboBox combo = new JComboBox();

        for (Categoria categoria : categorias) {
            combo.addItem(categoria.getNombre());
        }
        return combo;
    }

    public JComboBox getComboResponsables() {
        JComboBox combo = new JComboBox();

        for (Responsable responsable : responsables) {
            combo.addItem(responsable.getNombre());
        }
        return combo;
    }

    private void cargarCategorias() {
        try {
            this.categorias = DAOCategoria.getCategorias();
        } catch (MyException e) {
            JOptionPane.showMessageDialog(null, "Se produjo un error al cargar las categorias");
        }
    }

    private void cargarResponsables() {
        try {
            this.responsables = DAOResponsable.getResponsable();
        } catch (MyException e) {
            JOptionPane.showMessageDialog(null, "Se produjo un error al cargar los responsables");
        }
    }

    public String registrar(Tarea tarea, int selectedIndex, String emailTemp) {
        Categoria ct = this.categorias.get(selectedIndex);
        tarea.setId_Categoria(ct.getId_Categoria());

        for (Responsable responsable : responsables) {
            if (responsable.getEmail().equals(emailTemp)) {
                tarea.setId_Responsable(responsable.getId_Responsable());
                break;
            }
        }
        Tarea temp = DAOTarea.getUltimaTarea(tarea);
        if (temp == null) {
            if (DAOTarea.cargarTarea(tarea)) {
                return "Tarea cargada";
            } else {
                return "No se cargo la tarea";
            }
        } else {
            if (temp.getVencimiento().before(tarea.getVencimiento())) {
                if (DAOTarea.cargarTarea(tarea)) {
                    return "Tarea cargada";
                } else {
                    return "No se cargo la tarea";
                }
            } else {
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYY HH:mm");
                String fecha = sdf.format(temp.getVencimiento());
                return "El responsable seleccionado ya tiene una tarea asignada hasta: " + fecha;
            }
        }

    }

    public TableModel getModeloCompleto() {
        return modeloCompleto;
    }

    public TableModel getModel(TableModel modelo) {
        modeloCompleto = (DefaultTableModel) modelo;
        //////
        int filas = modelo.getRowCount();
        for (int i = 0; filas > i; i++) {
            modeloCompleto.removeRow(0);
        }
        //////
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        Date d = null;
        for (Tarea tarea : this.tareas) {
            d = tarea.getVencimiento();
            String temp = sdf.format(d);
            String[] dato = {String.valueOf(tarea.getId_Tarea()), tarea.getTitulo(), this.getCategoria(tarea.getId_Categoria()),
                this.getResponsable(tarea.getId_Responsable()), String.valueOf(tarea.getCompletado()), temp, tarea.getPrioridadString()};
            modeloCompleto.addRow(dato);
        }

        return modeloCompleto;
    }

    private void cargarTareas() {
        try {
            this.tareas = DAOTarea.getTarea();
        } catch (MyException e) {
            JOptionPane.showMessageDialog(null, "Se produjo un error");
        }
    }

    private String getCategoria(int idCategoria) {
        for (Categoria categoria : categorias) {
            if (categoria.getId_Categoria() == idCategoria) {
                return categoria.getNombre();
            }
        }
        return "";
    }

    private String getResponsable(int idResponsable) {
        for (Responsable responsable : responsables) {
            if (responsable.getId_Responsable() == idResponsable) {
                return responsable.getNombre();
            }
        }
        return "";
    }

    public String getEmailIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return responsables.get(selectedIndex).getEmail();
        }
        return "";
    }

    public String getApodoIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return responsables.get(selectedIndex).getApodo();
        }
        return "";
    }

    public int getId_CategoriaIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return categorias.get(selectedIndex).getId_Categoria();
        }
        return 0;
    }

    private int getId_ResponsableIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return responsables.get(selectedIndex).getId_Responsable();
        }
        return 0;
    }

    public DefaultTableModel filtrar(int indexCategoria, int indexPrioridad, int indexResponsable,
            Object limiteInferior, Object limiteSuperior,
            Calendar dateInferior, Calendar dateSuperior, TableModel modelo) {

        List<Tarea> tareasTemporal = new ArrayList<Tarea>(tareas);
        DefaultTableModel model = (DefaultTableModel) modelo;

        float li = 0, ls = 100;
        if (limiteInferior != null && limiteSuperior != null) {
            li = Float.parseFloat(limiteInferior.toString());
            ls = Float.parseFloat(limiteSuperior.toString());

        }
        //////
        int filas = modelo.getRowCount();
        for (int i = 0; filas > i; i++) {
            model.removeRow(0);
        }
        //////
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        Date d = null;
        //filtro las categorias
        if (indexCategoria != -1) {
            Iterator i = tareasTemporal.iterator();
            while (i.hasNext()) {
                Tarea tarea = (Tarea) i.next();
                if (tarea.getId_Categoria() != this.getId_CategoriaIndex(indexCategoria)) {
                    i.remove();
                }
            }
        }
        //filtro las prioridades
        if (indexPrioridad != -1) {
            Iterator i = tareasTemporal.iterator();
            while (i.hasNext()) {
                Tarea tarea = (Tarea) i.next();
                if (tarea.getPrioridad() != indexPrioridad) {
                    i.remove();
                }
            }
        }
        //filtro el responsable
        if (indexResponsable != -1) {
            Iterator i = tareasTemporal.iterator();
            while (i.hasNext()) {
                Tarea tarea = (Tarea) i.next();
                if (tarea.getId_Responsable() != this.getId_ResponsableIndex(indexResponsable)) {
                    i.remove();
                }
            }
        }

        //filtro el estado
        Iterator i = tareasTemporal.iterator();
        while (i.hasNext()) {
            Tarea tarea = (Tarea) i.next();
            double estadoTemporal = tarea.getCompletado();
            if (estadoTemporal < li || estadoTemporal > ls) {
                i.remove();
            }

        }

        //filtro por fecha
        if (dateInferior != null && dateSuperior != null) {
            Date di = dateInferior.getTime();
            Date ds = dateSuperior.getTime();
            Iterator i2 = tareasTemporal.iterator();
            while (i2.hasNext()) {
                Tarea tarea = (Tarea) i2.next();
                Date dateVto = tarea.getVencimiento();
                if (dateVto.before(di) || dateVto.after(ds)) {
                    i2.remove();
                }
            }
        }

        for (Tarea tarea : tareasTemporal) {
            d = tarea.getVencimiento();
            String temp = sdf.format(d);
            String[] dato = {String.valueOf(tarea.getId_Tarea()), tarea.getTitulo(), this.getCategoria(tarea.getId_Categoria()),
                this.getResponsable(tarea.getId_Responsable()), String.valueOf(tarea.getCompletado()), temp, tarea.getPrioridadString()};
            model.addRow(dato);
        }

        return model;
    }

    public String eliminar(String idTarea) {
        try {
            if (DAOTarea.eliminarTarea(idTarea)) {
                return "Tarea eliminada.";
            } else {
                return "No se pudo eliminar la tarea.";
            }
        } catch (MyException e) {
            return "Se produjo un error al eliminar la tarea.";
        }
    }

    public Tarea getTarea(int idTarea) {
        for (Tarea tarea : tareas) {
            if (tarea.getId_Tarea() == idTarea) {
                return tarea;
            }
        }
        return null;
    }

    public boolean modificarTarea(Tarea tarea) {
        try {
            if (DAOTarea.modificarTarea(tarea)) {
                return true;
            } else {
                return false;
            }

        } catch (MyException e) {
            System.out.println("Exp" + e);
            return false;
        }
    }

    public HashSet getResponsablesDisponibles(int idTarea) {
        //Filtro los responsables que podran tomar la tarea, desde la tabla los 
        //tomo ordenados.....
        Tarea tarea;
        tarea = this.getTarea(idTarea);
        int idTemp = -1;
        ArrayList<Tarea> listaTemporal = new ArrayList<Tarea>();
        List<Tarea> tareasxx = DAOTarea.getTarea2();
        for (Tarea tareaT : tareasxx) {
            if (tareaT.getId_Responsable() != tarea.getId_Responsable()) {

                if (idTemp != tareaT.getId_Responsable()) {
                    idTemp = tareaT.getId_Responsable();
                    if (tarea.getVencimiento().after(tareaT.getVencimiento())) {
                        listaTemporal.add(tareaT);
                    }
                }
            }
        }
        //Paso los responsables que podran tomar la tarea a un hash...
        HashSet<Responsable> responsablesDevolver = new HashSet<Responsable>();
        for (Tarea tarea1 : listaTemporal) {
            responsablesDevolver.add(DAOResponsable.getResponsableById(tarea1.getId_Responsable()));
        }

        for (Responsable tarea1 : responsablesDevolver) {System.out.println("bucle1");
            System.out.println(tarea1.getNombre());
        }
        //Agrego los responsables que NO TENGAN NINGUNA tarea...
        List<Responsable> misResponsables = DAOResponsable.getResponsable();
        for (Responsable responsable : misResponsables) {
            try {
                if (!DAOTarea.existenRelaciones(responsable)) {
                    responsablesDevolver.add(responsable);
                }
            } catch (Exception ex) {
                responsablesDevolver.add(responsable);
            }
        }

        for (Responsable tarea1 : responsablesDevolver) {
            System.out.println("bucle2");
            System.out.println(tarea1.getNombre());
        }
        return responsablesDevolver;

    }

    public void actualizarTareas() {
        this.cargarTareas();
    }

    public List<File> getListadoFile() {
        return ls;
    }

    public String reasignar(Responsable responsable, Tarea laTarea) {
        if (DAOTarea.reasignarResponsableTarea(responsable, laTarea)) {
            return "Se reasigno la tarea.";
        } else {
            return "NO ee reasigno la tarea.";
        }
    }

    public boolean modificarEstado(Tarea tarea) {
        try {
            if (DAOTarea.modificarEstadoTarea(tarea)) {
                return true;
            } else {
                return false;
            }

        } catch (MyException e) {
            return false;
        }
    }

}
